var Tag_Wall = (function (parent, $) {
    var my = parent.Tag_Wall = parent.Tag_Wall || {};
    my.wikid = function (results) {
        $('#Data').hide();

        var tag = results.doc.Tag_Wall.thing;
        var tags = results.doc.Tag_Wall.tags;
        var schemas = wikid.loadTagInstanceInfos(tags, results.db);
	    var docs = results.db.view("system/tag_to_tags", {key : tag});
        if (!docs || !docs.rows ) {
            return null;
        }
        if (results.doc.Tag_Wall.wallType == 'Checkbox') {
            my.checkboxWalltype(results, tag, tags,schemas, docs);
        }
        if (results.doc.Tag_Wall.wallType == 'Swimlane') {
            my.swimLaneWallType(results, tag, tags,schemas, docs);
        }
        

    };

    my.swimLaneWallType = function (results, tag, tags, schemas, docs) {
        var table = $('<table id="tagWallTable"></table>');
        $('#Info').append(table);
        $('#Tagged').appendTo('#Info');

        // do the headers
        var trh = $('<tr></tr>').appendTo(table);
        trh.append('<th>Not Set</th>');
        $.each(tags, function(j, tag) {
            var link = wikid.getTagLinkJqNode(tag);
            var th = $('<th></th>');
            th.append(link);
            trh.append(th);
        });
        // do the cols
        var tr = $('<tr></tr>').appendTo(table);
        tr.append('<td><div class="lane droppable notSet"></div></td>');
        $.each(tags, function(j, tag) {
            var td = $('<td></td>');
            var drop = $('<div class="lane droppable tag-' + tag + '"></div>');
            drop.data('tag', tag);
            td.append(drop);
            tr.append(td);
        });


        $.each(docs.rows, function(i, doc) {

            var link = wikid.getTagLinkJqNode(doc.id);
            var drag = $('<div class="draggable"></div>');
            drag.data('doc_id', doc.id);
            drag.append(link);
            var tag_set = false;
            $.each(tags, function(j, tag) {
                if (!tag_set && $.inArray(tag, doc.value) >= 0) {
                    $('.tag-' + tag).append(drag);
                    tag_set = true;
                }
            });
            if (!tag_set) {
                $('.notSet').append(drag);
            }

        });

        $(".draggable").draggable({ revert: 'invalid' })
        .css({
            'background-color':'#DEDEDE',
            'padding' : '4px',
            'margin':'0px 2px 5px 2px'

        });
        $(".droppable").droppable({

			hoverClass: 'ui-state-highlight',
			drop: function(event, ui) {
                var tag_row = $(this);
                var thing = ui.draggable;
				thing.appendTo(tag_row);
                thing.css({'top' : '0px', 'left' : '0px'});
                var tag_to_use = tag_row.data('tag');
                var doc_id = thing.data('doc_id');
                var bad_tags = $.map(tags, function(item) {
                    if (item == tag_to_use) return null;
                    else return item;
                });
                my.saveGoodTagBadTag(results.db, doc_id, [tag_to_use, results.doc['_id'] ], bad_tags);
                my.resizeLane();
			}
		}).css({'min-height': '400px', 'border-right' : '1px solid grey'});
        $("#tagWallTable td").css({'padding':'0px'});
        my.resizeLane();

    }

    my.resizeLane = function() {
        var maxHeight = 0;
        $('.lane').each(function() {
            var height = $(this).height();
            if (height > maxHeight) maxHeight = height;
        });
        $('.lane').each(function() {
            $(this).height(maxHeight);
        });

    }

    my.checkboxWalltype = function (results, tag, tags, schemas, docs) {
        var table = $('<table id="tagWallTable"></table>');
        $('#Info').append(table);
        $('#Tagged').appendTo('#Info');

        // do the headers
        var trh = $('<tr></tr>').appendTo(table);
        trh.append('<th>' + results.doc.Tag_Wall.thing + '</th>');
        $.each(tags, function(j, tag) {
            var link = wikid.getTagLinkJqNode(tag);
            var th = $('<th></th>').append(link);
            trh.append(th);
        });


        $.each(docs.rows, function(i, doc) {
            var link = wikid.getTagLinkJqNode(doc.id);
            var tr = $('<tr></tr>');
            tr.hover(function(){ $(this).addClass("ui-state-highlight"); },function() { $(this).removeClass("ui-state-highlight"); });
            var td = $('<td></td>').append(link);
            tr.append(td);
            $.each(tags, function(j, tag) {

                var input = $('<input type="checkbox" />');
                if ($.inArray(tag, doc.value) >= 0) {
                    input.attr('checked', true);
                }
                input.click(function() {
                    my.updateTagToDoc(results.db, doc.id, tag, input.attr('checked'));
                });
                var td2 = $('<td></td>').append(input);
                tr.append(td2)
            });
            tr.appendTo(table);
        });
    }

    my.saveGoodTagBadTag = function(db, doc, goodTags, badTags) {
        var full_doc = db.open(doc);
        var tags = full_doc["-tags"] || [];
        $.each(goodTags, function(i, goodTag) {
            if ($.inArray(goodTag, tags) < 0) {
                tags.push(goodTag);
            }
        });
        tags = $.grep(tags, function(item, i) {
            if ($.inArray(item, badTags) >= 0) {
                return false;
            } else return true;
        });

        full_doc["-tags"] = tags;
        db.save(full_doc);
    }


    my.updateTagToDoc = function(db, doc, tag, isTagged) {
        var full_doc = db.open(doc);
        var tags = full_doc["-tags"] || [];
        var inArray = $.inArray(tag, tags);
        if (isTagged && inArray < 0) {
            tags.push(tag)
        }
        else if (!isTagged && inArray >=0 ) {
            tags = $.grep(tags, function(value) {
                return value != tag;
            });
        }

        
        full_doc["-tags"] = tags;
        db.save(full_doc);

    }


    my.edit = function(results) {
        $(document).bind("save", function() {
            // collect all the tags
            var tags = [];
            $(".jeclass[id^='inputid.json_root.tags.']").each(function() {
                tags.push($(this).val());
            })
            var exists  = $.map(results.db.allDocs({}, tags).rows, function(row) {
                return row.id;
            });
            var now = new Date();
			var t_stamp = iso8601(now);
            $.each(tags, function(i, tag) {
                if($.inArray(tag, exists) < 0 ) {
                    var doc = {
                        '_id' : tag,
                        '-lastmodified' : t_stamp
                    };
                    results.db.save(doc);
                }
            });
        });
    }




    return parent;
}(wikid || {}, jQuery));